import numpy as np
import struct
import os

#专门用于读取SIFT1M数据集的程序
#从fvec中读取向量。数据格式固定为128维float32向量前面有4个字节的dim。
#offset是读取偏移量，不是每次都从开头读取。单位为向量，即跳过前面的offset个向量。read_count为读取的行数。
#返回值是一个np数组，shape为(read_count, 128),dtype=float32
def read_fvecs_SIFT1M(file_path, offset, read_count): 
    #设置数据格式，用于读取文件
    format_string = 'i'+'f'*128
    struct_size = struct.calcsize(format_string)
    
    vectors = np.empty((read_count, 128),dtype=np.float32)
    fd = open(file_path, "rb")

    fd.seek(offset*struct_size)

    for i in range(read_count):
        line = fd.read(struct_size)
        values = struct.unpack_from(format_string, line, 0)
        vectors[i] = values[1:]

    fd.close()

    return vectors

def relative_to_absolute(relative_path):
    # 获取当前工作目录
    current_working_directory = os.getcwd()
    # 将相对路径转化为绝对路径
    absolute_path = os.path.abspath(os.path.join(current_working_directory, relative_path))
    return absolute_path